package com.handpay.framework.upcard.sdom;

import java.util.Hashtable;
import java.util.Vector;

/**
 * @author <a href="mailto:justin.hou@handpay.com.cn">Sora</a>
 * @version 1.0
 * 
 *          XML节点封装
 */
public class TagNode
{
	/**
	 * XML节点构
	 * 
	 * @param name
	 *            XML节点的名称
	 * @param type
	 *            XML节点的类型，分别为TAG_START(节点)，TAG_TEXT(文字节点)和TAG_END(结束节点)�?
	 */
	public TagNode(String name, int type)
	{
		tag_name = name;
		tag_type = type;
		
		parent_node = null;
		child_node = null;
		sibling_node = null;
		pred_sibling_node = null;
		
		hash_attributes = null;
	}
	
	/**
	 * 设置父节点
	 * 
	 * @param node
	 *            节点的父节点
	 */
	public void setParent(TagNode node)
	{
		parent_node = node;
	}
	
	/**
	 * 获取节点父节点
	 * 
	 * @return 节点的父节点
	 */
	public TagNode getParent()
	{
		return parent_node;
	}
	
	/**
	 * 设置节点的子节点
	 * 
	 * @param node
	 *            节点的子节点
	 */
	public void setChild(TagNode node)
	{
		child_node = node;
		if (null != node)
			node.setParent(this);
	}
	
	/**
	 * 根据索引号获得子节点
	 * 
	 * @param index
	 *            子节点的索引号
	 * @return 相应索引号的子节点
	 */
	public TagNode getChild(int index)
	{
		int count = 0;
		
		for (TagNode t = child_node; t != null; t = t.getSibling(), count++)
		{
			if (index == count)
				return t;
		}
		return null;
	}
	
	/**
	 * 设置节点的兄弟节点
	 * 
	 * @param node
	 *            节点的兄弟节点
	 */
	public void setSibling(TagNode node)
	{
		sibling_node = node;
		if (node != null)
			node.setPredSibling(this);
	}
	
	/**
	 * 获得相邻的兄弟节点
	 * 
	 * @return 相邻的兄弟节点
	 */
	public TagNode getSibling()
	{
		return sibling_node;
	}
	
	/**
	 * 设置前一个兄弟节点
	 * 
	 * @param node
	 *            前一个兄弟节点
	 */
	public void setPredSibling(TagNode node)
	{
		pred_sibling_node = node;
	}
	
	/**
	 * 获得前一个兄弟节点
	 * 
	 * @return 前一个兄弟节点
	 */
	public TagNode getPredSibling()
	{
		return pred_sibling_node;
	}
	
	/**
	 * 设置节点的属性列表
	 * 
	 * @param attributes
	 *            节点的属性
	 */
	public void setAttributes(Hashtable<String, String> attributes)
	{
		hash_attributes = attributes;
	}
	
	/**
	 * 获得节点的属性列表
	 * 
	 * @return 节点的属性列表
	 */
	public Hashtable<String, String> getAttributes()
	{
		return hash_attributes;
	}
	
	/**
	 * 获得节点的属性
	 * 
	 * @param name
	 *            属性名称
	 * @return 属性值
	 */
	public String getAttribute(String name)
	{
		return hash_attributes.get(name);
	}
	
	/**
	 * 获得节点的名字
	 * 
	 * @return 节点的名字
	 */
	public String getName()
	{
		return tag_name;
	}
	
	/**
	 * 获得节点的类型
	 * 
	 * @return 节点的类型
	 */
	public int getTagType()
	{
		return tag_type;
	}
	
	/**
	 * 判断是否为叶子节点
	 * 
	 * @return 如果为叶子节点返回TRUE，否则返回FALSE�?
	 */
	public boolean isLeaf()
	{
		return getChild(0) == null;
	}
	
	/**
	 * 获取当前节点的文本节点
	 * 
	 * @return 当前节点的文本节点若不存在，返回NULL
	 */
	public TagNode getContent()
	{
		for (TagNode t = getChild(0); t != null; t = t.getSibling())
		{
			if (t.getTagType() == TagNode.TAG_TEXT)
				return t;
		}
		
		return null;
	}
	
	/**
	 * 获取对应名称的子节点
	 * 
	 * @param name
	 *            子节点名字
	 * @return 若存在返回相应子节点，不存在返回NULL
	 */
	public TagNode getChild(String name)
	{
		for (TagNode t = getChild(0); t != null; t = t.getSibling())
		{
			if (name.equals(t.getName()))
				return t;
		}
		
		return null;
	}
	
	/**
	 * 获取子节点列表
	 * 
	 * @return 当前节点的所有子节点
	 */
	public Vector<TagNode> getChildren()
	{
		Vector<TagNode> children = new Vector<TagNode>();
		for (TagNode t = getChild(0); t != null; t = t.getSibling())
			children.addElement(t);
		
		return children;
	}
	
	/**
	 * 获取对应名称的所有子节点
	 * 
	 * @param name
	 *            子节点名字
	 * @return 若存在返回相应所有子节点
	 */
	public Vector<TagNode> getChildren(String name)
	{
		Vector<TagNode> v = new Vector<TagNode>();
		for (TagNode t = getChild(0); t != null; t = t.getSibling())
		{
			if (name.equals(t.getName()))
				v.addElement(t);
		}
		
		// return null;
		return v;
	}
	
	/**
	 * 节点名称
	 */
	String						tag_name;
	/**
	 * 节点类型 TAG_START: 开始标签 TAG_TEXT: 文本标签 TAG_END: 结束标签
	 */
	int							tag_type;
	
	/**
	 * 节点的父节点
	 */
	TagNode						parent_node;
	/**
	 * 节点的第一子节点
	 */
	TagNode						child_node;
	/**
	 * 节点的下一个兄弟节点
	 */
	TagNode						sibling_node;
	/**
	 * 节点的前一个兄弟节点
	 */
	TagNode						pred_sibling_node;
	
	/**
	 * 节点的属性列表
	 */
	Hashtable<String, String>	hash_attributes;
	
	public static final int		TAG_START	= 1;
	public static final int		TAG_TEXT	= 2;
	public static final int		TAG_END		= 3;
	
}
